Mobility, Latent Trend and Omega for all states

  1. mobility trend for all states (spaghetti with mean).

Covariate that describes human mobility. These data come from Unacast. We smooth the raw data from Unacast using a spline fit, resulting in the trajectories of human movement shown below. This covariate is used to reduce baseline transmission. Here we show the mobility trends from all 50 states.


  1. latent trend for all states (spaghetti with mean).

  1. omega for all states (spaghetti with mean).

Correlation between Omega and Prevalence

  1. predictor = omega(t); response = daily prevalence(t)


California, and mean across states, at varying lags


  1. predictor = AUC of omega over time; response = cumulative all infections over time


  1. predictor = AUC of omega; response = cumulative all infections

  1. map of same (correlation, by state)

To be made

Correlation between Mobility and Omega

LS0tCnRpdGxlOiAiRmlndXJlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogRXJpYyBNYXJ0eQotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgb3V0LndpZHRoID0gIjEwMCUiKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoeWFyZHN0aWNrKQpgYGAKCmBgYHtyIGRhdGF9CmFsbF9maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBoZXJlKCJvdXRwdXQvY3VycmVudC8iKSwgcGF0dGVybiA9ICIuY3N2IikKcGFyYW1fZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gaGVyZSgib3V0cHV0L2N1cnJlbnQvIiksIHBhdHRlcm4gPSAicGFyYW1zLW5hdHVyYWwucmRzIikKc3RhdGVfc3VtbWFyaWVzIDwtIHRpYmJsZSgpCnN0YXRlX3BhcmFtZXRlcnMgPC0gdGliYmxlKCkKc3RhdGVfbG9nbGlrcyA8LSB0aWJibGUoKQpzdGF0ZWRmIDwtcmVhZFJEUyhoZXJlKCJvdXRwdXQvY3VycmVudCIsICJzdGF0ZWRmLnJkcyIpKQpmb3IoaSBpbiAxOmxlbmd0aChhbGxfZmlsZXMpKSB7CiAgZG9fZmlsZSA8LSBhbGxfZmlsZXNbaV0KICBsb2NhdGlvbiA8LSBzdWIoIi5jc3YiLCAiIiwgZG9fZmlsZSkKICBzdGF0ZV9tZXRhZGF0YSA8LSBzdGF0ZWRmICU+JSBmaWx0ZXIoc3RhdGVfZnVsbCA9PSBzdWIoIi5jc3YiLCAiIiwgZG9fZmlsZSkpCiAgc3RhdGVfcG9wIDwtIHN0YXRlX21ldGFkYXRhICU+JSBwdWxsKHRvdGFsX3BvcCkKICBzdGF0ZV9pbml0UjAgPC0gc3RhdGVfbWV0YWRhdGEgJT4lIHB1bGwoaW5pdFIwKQogIHN0YXRlX2JldGFfcyA8LSAoc3RhdGVfaW5pdFIwKi4xKQogIAogIAogIHRtcGZpbGUgPC0gaGVyZSgib3V0cHV0L2N1cnJlbnQiLCBkb19maWxlKQogIHRtcCA8LSByZWFkLmNzdih0bXBmaWxlKSAlPiUKICAgIGZpbHRlcihzaW1fdHlwZSA9PSAic3RhdHVzX3F1byIgfCBpcy5uYShzaW1fdHlwZSksCiAgICAgICAgICAgdmFyaWFibGUgJWluJSBjKCJkYWlseV9jYXNlcyIsICJkYWlseV9kZWF0aHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0dWFsX2RhaWx5X2Nhc2VzIiwgImFjdHVhbF9kYWlseV9kZWF0aHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibW9iaWxpdHlfdHJlbmQiLCAibGF0ZW50X3RyZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMiLCAiZGFpbHlfYWxsX2luZmVjdGlvbnMiKSkgJT4lCiAgICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSkpICU+JQogICAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgc2ltX3R5cGUsIHBlcmlvZCwgZGF0ZSwgdmFyaWFibGUsIG1lYW5fdmFsdWUpICU+JSAKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3ZhbHVlKSAlPiUKICAgIG11dGF0ZShiZXRhX3MgPSBzdGF0ZV9iZXRhX3MpICU+JSAKICAgIG11dGF0ZShwcmV2YWxlbmNlID0gZGFpbHlfYWxsX2luZmVjdGlvbnMgLyBzdGF0ZV9wb3ApICU+JSAKICAgIG11dGF0ZShvbWVnYSA9IG1vYmlsaXR5X3RyZW5kICogbGF0ZW50X3RyZW5kICogYmV0YV9zKSAlPiUgCiAgICBwaXZvdF9sb25nZXIoY29scyA9ICFjKGxvY2F0aW9uLCBzaW1fdHlwZSwgcGVyaW9kLCBkYXRlKSwgCiAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidmFyaWFibGUiLCAKICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWVhbl92YWx1ZSIsCiAgICAgICAgICAgICAgICAgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQoKICBzdGF0ZV9zdW1tYXJpZXMgPC0gYmluZF9yb3dzKHN0YXRlX3N1bW1hcmllcywgdG1wKSAjID8gd2FzIHRoaXMgbWlzc2luZz8KCiAgdG1wcGFyYW1maWxlIDwtIGhlcmUoIm91dHB1dC9jdXJyZW50IiwgcGFyYW1fZmlsZXNbaV0pCiAgdG1wcGFyYW1zIDwtIHJlYWRSRFModG1wcGFyYW1maWxlKQogIHRtcF9sb2dsaWsgPC0gZGF0YS5mcmFtZShsb2NhdGlvbiA9IHVuaXF1ZSh0bXAkbG9jYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGlrID0gdG1wcGFyYW1zWyJMb2dMaWsiLCAyXSkKICBybm1zIDwtIHJvdy5uYW1lcyh0bXBwYXJhbXMpCiAgdG1wcGFyYW1zIDwtIHRtcHBhcmFtcyAlPiUKICAgIG11dGF0ZShwYXJhbWV0ZXIgPSBybm1zKSAlPiUKICAgIGZpbHRlcihpc19maXR0ZWQgPT0gInllcyIpICU+JQogICAgZHBseXI6OnNlbGVjdCgtaXNfZml0dGVkKSAlPiUKICAgIGdhdGhlcigia2V5IiwgInZhbHVlIiwgLXBhcmFtZXRlcikgJT4lCiAgICBmaWx0ZXIoa2V5ID09ICJYMSIpICU+JQogICAgZHBseXI6OnNlbGVjdCgta2V5KSAlPiUKICAgIG11dGF0ZShsb2NhdGlvbiA9IHVuaXF1ZSh0bXAkbG9jYXRpb24pKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIHZhbHVlLCBwYXJhbWV0ZXIpCiAgCiAgc3RhdGVfcGFyYW1ldGVycyA8LSBiaW5kX3Jvd3Moc3RhdGVfcGFyYW1ldGVycywgdG1wcGFyYW1zKQogIHN0YXRlX2xvZ2xpa3MgPC0gYmluZF9yb3dzKHN0YXRlX2xvZ2xpa3MsIHRtcF9sb2dsaWspCn0KCiMgRml4ZWQgcGFyYW1ldGVycyB0YWJsZQpiZXRhc19uYW1lcyA8LSBybm1zW2dyZXAoImJbMC05XSsiLCBybm1zKV0gIyBmaW5kIHBhcmFtZXRlcnMgc3RhcnRpbmcgd2l0aCBiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIKc3BsaW5lX2NvZWZmaWNpZW50cyA8LSBwYXN0ZSgiU3BsaW5lIGNvZWZmaWNpZW50IiwgZ3N1YigiYiIsIiIsIGJldGFzX25hbWVzKSkKbmFtZXMoc3BsaW5lX2NvZWZmaWNpZW50cykgPC0gYmV0YXNfbmFtZXMKCnBhcmFtc192ZWMgPC0gYyhNSUZfSUQgPSAiTUlGIGlkIiwgCiAgICAgICAgICAgICAgICBMb2dMaWsgPSAiTG9nIExpa2VsaWhvb2QiLCAKICAgICAgICAgICAgICAgIExvZ0xpa19TRSA9ICJTRSBvZiBMb2cgTGlrZWxpaG9vZCIsIAogICAgICAgICAgICAgICAgYmV0YV9zID0gIlRyYW5zbWlzc2lvbiByYXRlIiwKICAgICAgICAgICAgICAgICMgUmVsYXRpdmUgVHJhbnNtaXNzaWJpbGl0eQogICAgICAgICAgICAgICAgZnJhY190cmFuc19lID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgbGF0ZW50IGluZmVjdGlvbnMiLAogICAgICAgICAgICAgICAgZnJhY190cmFuc19hID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgYXN5bXB0b21hdGljIGluZGl2aWR1YWxzIiwKICAgICAgICAgICAgICAgIGZyYWNfdHJhbnNfYyA9ICJSZWxhdGl2ZSB0cmFuc21pc3NpYmlsaXR5IG9mIGRldGVjdGVkIHN5bXB0b21hdGljIGluZGl2aWR1YWxzIHBvc3QtcmVwb3J0aW5nIiwKICAgICAgICAgICAgICAgIGZyYWNfdHJhbnNfaCA9ICJSZWxhdGl2ZSB0cmFuc21pc3NpYmlsaXR5IG9mIGhvc3BpdGFsaXplZCBpbmRpdmlkdWFscyIsCiAgICAgICAgICAgICAgICAjIFRpbWUgaW4gY29tcGFydG1lbnRzCiAgICAgICAgICAgICAgICB0aW1lX2UgPSAiVGltZSBzcGVudCBpbiBsYXRlbnQgY29tcGFydG1lbnRzIChkYXlzKSIsCiAgICAgICAgICAgICAgICB0aW1lX2EgPSAiVGltZSBzcGVudCBpbiBhc3ltcHRvbWF0aWMgY29tcGFydG1lbnRzIChkYXlzKSIsCiAgICAgICAgICAgICAgICB0aW1lX3N1ID0gIlRpbWUgc3BlbnQgaW4gc3ltcHRvbWF0aWMsIHVuZGV0ZWN0ZWQgY29tcGFydG1lbnRzIChkYXlzKSIsCiAgICAgICAgICAgICAgICB0aW1lX3NkID0gIlRpbWUgc3BlbnQgaW4gc3ltcHRvbWF0aWMsIGRldGVjdGVkIGNvbXBhcnRtZW50cyAoZGF5cykiLAogICAgICAgICAgICAgICAgdGltZV9jID0gIlRpbWUgc3BlbnQgaW4gZGlhZ25vc2VkIGNhc2VzIGNvbXBhcnRtZW50cyAoZGF5cykiLAogICAgICAgICAgICAgICAgdGltZV9oID0gIlRpbWUgc3BlbnQgaW4gaG9zcGl0YWxpemVkIGNvbXBhcnRtZW50cyAoZGF5cykiLAogICAgICAgICAgICAgICAgIyBEZXRlY3Rpb24gdGltZQogICAgICAgICAgICAgICAgbWF4X2RpYWdfZmFjdG9yID0gIk1heGltdW0gZm9yIGZhY3RvciBieSB3aGljaCBtb3ZlbWVudCB0aHJvdWdoIElzZCBoYXBwZW5zIGZhc3RlciAocXVpY2tlciBkaWFnbm9zaXMpIiwKICAgICAgICAgICAgICAgIGRpYWdfcmFtcHVwID0gIlJhdGUgYXQgd2hpY2ggZmFzdGVyIGRpYWdub3NpcyByYW1wcyB1cCB0byBtYXgiLAogICAgICAgICAgICAgICAgdF9oYWxmX2RpYWcgPSAiVGltZSBhdCB3aGljaCBkaWFnbm9zaXMgaXMgYXQgNTAlIG9mIG1heCAoaW4gZGF5cyBzaW5jZSB0ID0gMSkiLAogICAgICAgICAgICAgICAgIyBEZXRlY3Rpb24gZnJhY3Rpb24KICAgICAgICAgICAgICAgIG1heF9kZXRlY3RfZnJhYyA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGNhc2VzIHRoYXQgYXJlIGRldGVjdGVkIiwKICAgICAgICAgICAgICAgIGRldGVjdF9yYW1wdXAgPSAiU3BlZWQgYXQgd2hpY2ggZnJhY3Rpb24gZGV0ZWN0ZWQgcmFtcHMgdXAiLAogICAgICAgICAgICAgICAgdF9oYWxmX2RldGVjdCA9ICJUaW1lIGF0IHdoaWNoIGluZmVjdGlvbiBkZXRlY3Rpb24gZnJhY3Rpb24gaXMgYXQgNTAlIG9mIG1heCAoaW4gZGF5cyBzaW5jZSB0ID0gMSkiLAogICAgICAgICAgICAgICAgYmFzZV9kZXRlY3RfZnJhYyA9ICJNaW5pbXVtIGZyYWN0aW9uIGRldGVjdGVkIGF0IHQgPSAxIiwKICAgICAgICAgICAgICAgICMgRnJhY3Rpb24gYXN5bXB0b21hdGljCiAgICAgICAgICAgICAgICBmcmFjX2FzeW0gPSAiRnJhY3Rpb24gb2YgbGF0ZW50IGluZmVjdGlvbnMgdGhhdCBtb3ZlIHRvIGFzeW1wdG9tYXRpYyIsCiAgICAgICAgICAgICAgICAjIEZyYWN0aW9uIGhvc3B0aWxpemVkCiAgICAgICAgICAgICAgICBmcmFjX2hvc3AgPSAiRnJhY3Rpb24gb2YgZGV0ZWN0ZWQgY2FzZXMgdGhhdCBhcmUgaG9zcGl0YWxpemVkIiwKICAgICAgICAgICAgICAgICMgRnJhY3Rpb24gb2YgaG9zcGl0YWxpemF0aW9ucyB0aGF0IHJlc3VsdCBpbiBkZWF0aAogICAgICAgICAgICAgICAgbWluX2ZyYWNfZGVhZCA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGhvc3BpdGFsaXphdGlvbnMgdGhhdCByZXN1bHQgaW4gZGVhdGgiLAogICAgICAgICAgICAgICAgbWF4X2ZyYWNfZGVhZCA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGhvc3BpdGFsaXphdGlvbnMgdGhhdCByZXN1bHQgaW4gZGVhdGgiLAogICAgICAgICAgICAgICAgbG9nX2hhbGZfZGVhZCA9ICJUaW1lIGF0IHdoaWNoIGRlYXRoIGZyYWN0aW9uIGlzIGF0IDUwJSBvZiBtYXggKGluIGRheXMgc2luY2UgdCA9IDEpIiwKICAgICAgICAgICAgICAgICMgRGlzcGVyc2lvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICB0aGV0YV9jYXNlcyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgY2FzZSByZXBvcnRpbmcgb2JzZXJ2YXRpb24gcHJvY2VzcyIsCiAgICAgICAgICAgICAgICB0aGV0YV9ob3NwcyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgaG9zcGl0YWxpemF0aW9uIHJlcG9ydGluZyBvYnNlcnZhdGlvbiBwcm9jZXNzIiwKICAgICAgICAgICAgICAgIHRoZXRhX2RlYXRocyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgZGVhdGggcmVwb3J0aW5nIG9ic2VyY2F0aW9uIHByb2Nlc3MiLAogICAgICAgICAgICAgICAgc2lnbWFfZHcgPSAiVmFyaWFuY2Ugb2YgdGhlIHN0b2NoYXN0aWNzIHByb2Nlc3Mgbm9pc2UiLAogICAgICAgICAgICAgICAgIyBTcGxpbmUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICBzcGxpbmVfY29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgIyBJbml0aWFsIGNvbmRpdGlvbnMKICAgICAgICAgICAgICAgIFNfMCA9ICJJbml0aWFsIG51bWJlciBvZiBzdXNjZXB0aWJsZSBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBFMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGxhdGVudCBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKICAgICAgICAgICAgICAgIElhMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGFzeW1wdG9tYXRpYyBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBJc3UxXzAgPSAiSW5pdGlhbCBudW1iZXIgb2Ygc3ltcHRvbWF0aWMsIHVuZGV0ZWN0ZWQgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAogICAgICAgICAgICAgICAgSXNkMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIHN5bXB0b21hdGljLCBkZXRlY3RlZCBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBDMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGRpYWdub3NlZCBjYXNlcyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBIMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGhvc3BpdGFsaXplZCBjYXNlcyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBSXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgcmVjb3ZlcmVkIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKICAgICAgICAgICAgICAgIERfMCA9ICJJbml0aWFsIG51bWJlciBvZiBkZWF0aHMgYWZ0ZXIgaG9zcGl0YWxpemF0aW9uIG9uIHQgPSAxIiwKICAgICAgICAgICAgICAgIHRyZW5kX3N0YXJ0ID0gIlRyZW5kIikKCnRtcHBhcmFtcyA8LSByZWFkUkRTKHRtcHBhcmFtZmlsZSkKcm5tcyA8LSByb3cubmFtZXModG1wcGFyYW1zKQpwYXJhbXNfbWFwIDwtIHRpYmJsZShQYXJhbWV0ZXIgPSBuYW1lcyhwYXJhbXNfdmVjKSwKICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPSBwYXJhbXNfdmVjKQpmaXhlZF9wYXJhbWV0ZXJzIDwtIHRtcHBhcmFtcyAlPiUKICBtdXRhdGUoUGFyYW1ldGVyID0gcm5tcykgJT4lCiAgZmlsdGVyKGlzX2ZpdHRlZCA9PSAibm8iKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1pc19maXR0ZWQpICU+JQogIGdhdGhlcigia2V5IiwgInZhbHVlIiwgLVBhcmFtZXRlcikgJT4lCiAgZmlsdGVyKGtleSA9PSAiWDEiKSAlPiUKICBsZWZ0X2pvaW4ocGFyYW1zX21hcCwgYnkgPSAiUGFyYW1ldGVyIikgJT4lCiAgZmlsdGVyKCFQYXJhbWV0ZXIgJWluJSBjKCJNSUZfSUQiLCAiTG9nTGlrIiwgIkxvZ0xpa19TRSIsICJ0cmVuZF9zdGFydCIsICJ0aGV0YV9ob3NwcyIsICJTXzAiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChQYXJhbWV0ZXIsIERlc2NyaXB0aW9uLCB2YWx1ZSkgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IGlmZWxzZShQYXJhbWV0ZXIgPT0gIkUxXzAiLCAiTDFfMCIsIFBhcmFtZXRlcikpCgpmdXR1cmUgPC0gc3RhdGVfc3VtbWFyaWVzICU+JSBmaWx0ZXIocGVyaW9kID09ICJGdXR1cmUiKSAlPiUgcHVsbChkYXRlKSAlPiUgcmFuZ2UoKQoKYGBgCgojIE1vYmlsaXR5LCBMYXRlbnQgVHJlbmQgYW5kIE9tZWdhIGZvciBhbGwgc3RhdGVzCgphKSBtb2JpbGl0eSB0cmVuZCBmb3IgYWxsIHN0YXRlcyAoc3BhZ2hldHRpIHdpdGggbWVhbikuICAKCkNvdmFyaWF0ZSB0aGF0IGRlc2NyaWJlcyBodW1hbiBtb2JpbGl0eS4gVGhlc2UgZGF0YSBjb21lIGZyb20gPGEgaHJlZj0iaHR0cHM6Ly93d3cudW5hY2FzdC5jb20vIiB0YXJnZXQ9Il9ibGFuayI+VW5hY2FzdDwvYT4uIFdlIHNtb290aCB0aGUgcmF3IGRhdGEgZnJvbSBVbmFjYXN0IHVzaW5nIGEgc3BsaW5lIGZpdCwgcmVzdWx0aW5nIGluIHRoZSB0cmFqZWN0b3JpZXMgb2YgaHVtYW4gbW92ZW1lbnQgc2hvd24gYmVsb3cuIFRoaXMgY292YXJpYXRlIGlzIHVzZWQgdG8gcmVkdWNlIGJhc2VsaW5lIHRyYW5zbWlzc2lvbi4KSGVyZSB3ZSBzaG93IHRoZSBtb2JpbGl0eSB0cmVuZHMgZnJvbSBhbGwgNTAgc3RhdGVzLgoKYGBge3IgY292YXJpYXRlLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03LCBldmFsID0gVFJVRX0KYWxsX3BoaSA8LSBzdGF0ZV9zdW1tYXJpZXMgJT4lCiAgZmlsdGVyKHZhcmlhYmxlID09ICJtb2JpbGl0eV90cmVuZCIpICU+JQogIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIGRhdGUsIG1lYW5fdmFsdWUpICU+JQogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpCgptZWFuX3BoaSA8LSBhbGxfcGhpICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKHBoaSA9IG1lYW4obWVhbl92YWx1ZSkpCgpnX3BoaSA8LSBnZ3Bsb3QoYWxsX3BoaSwgYWVzKHggPSBkYXRlLCB5ID0gbWVhbl92YWx1ZSwgY29sb3IgPSBsb2NhdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogICMgeWxhYigiSHVtYW4gbW92ZW1lbnRcbiglIG9mIG5vcm1hbCkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJEIiwgZGlyZWN0aW9uID0gLTEsIGFscGhhID0gLjYsIGVuZCA9IC43NSkgKwogICMgdGhlbWVfZGFyayhiYXNlX2xpbmVfc2l6ZSA9IDAuNSkgKwogIGdlb21fbGluZShkYXRhID0gbWVhbl9waGksIGFscGhhID0gLjYsIHNpemUgPSAyLCBjb2xvciA9ICdyZWQnLCBuYW1lPSJNZWFuIG9mIGFsbCBzdGF0ZXMiKSArCiAgIyBnZW9tX3JlY3QoYWVzKHhtaW49ZnV0dXJlWzFdLCB4bWF4PWZ1dHVyZVsyXSwgeW1pbj0wLCB5bWF4PTEpKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gZnV0dXJlWzFdLCB4bWF4ID0gZnV0dXJlWzJdLCB5bWluID0gMCwgeW1heCA9IDEsIGFscGhhID0gLjIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKQoKcF9waGkgPC0gZ19waGkgJT4lIHBsb3RseTo6Z2dwbG90bHkoKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICMgbWFyZ2luID0gbGlzdChsID0gMTUwKSwKICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSHVtYW4gbW92ZW1lbnQgKHBoaSlcbiglIG9mIG5vcm1hbClcbiZuYnNwOyIpCiAgICAgICAgICAgICAgICAgKQpwX3BoaQpgYGAKCi0tLQoKYikgbGF0ZW50IHRyZW5kIGZvciBhbGwgc3RhdGVzIChzcGFnaGV0dGkgd2l0aCBtZWFuKS4gIAoKYGBge3J9CmFsbF9wc2kgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcih2YXJpYWJsZSA9PSAibGF0ZW50X3RyZW5kIikgJT4lCiAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgZGF0ZSwgbWVhbl92YWx1ZSkgJT4lCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fcHNpIDwtIGFsbF9wc2kgJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UocHNpID0gbWVhbihtZWFuX3ZhbHVlKSkKCmdfcHNpIDwtIGdncGxvdChhbGxfcHNpLCBhZXMoeCA9IGRhdGUsIHkgPSBtZWFuX3ZhbHVlLCBjb2xvciA9IGxvY2F0aW9uKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgIyB5bGFiKCJMYXRlbnQgdHJlbmRcbiglIG9mIG5vcm1hbCkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJEIiwgZGlyZWN0aW9uID0gLTEsIGFscGhhID0gLjYsIGVuZCA9IC43NSkgKwogICMgdGhlbWVfZGFyayhiYXNlX2xpbmVfc2l6ZSA9IDAuNSkgKwogIGdlb21fbGluZShkYXRhID0gbWVhbl9wc2ksIGFscGhhID0gLjYsIHNpemUgPSAyLCBjb2xvciA9ICdyZWQnLCBuYW1lPSJNZWFuIG9mIGFsbCBzdGF0ZXMiKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gZnV0dXJlWzFdLCB4bWF4ID0gZnV0dXJlWzJdLCB5bWluID0gMCwgeW1heCA9IDEsIGFscGhhID0gLjIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKQoKcF9wc2kgPC0gZ19wc2kgJT4lIHBsb3RseTo6Z2dwbG90bHkoKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICMgbWFyZ2luID0gbGlzdChsID0gMTUwKSwKICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTGF0ZW50IHRyZW5kIChwc2kpXG4oJSBvZiBub3JtYWwpXG4mbmJzcDsiKQogICAgICAgICAgICAgICAgICkKcF9wc2kKYGBgCgotLS0KCmMpIG9tZWdhIGZvciBhbGwgc3RhdGVzIChzcGFnaGV0dGkgd2l0aCBtZWFuKS4gCgpgYGB7cn0KYWxsX29tZWdhIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gIm9tZWdhIikgJT4lCiAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgZGF0ZSwgbWVhbl92YWx1ZSkgJT4lCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fb21lZ2EgPC0gYWxsX29tZWdhICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKG9tZWdhID0gbWVhbihtZWFuX3ZhbHVlKSkKCmdfb21lZ2EgPC0gZ2dwbG90KGFsbF9vbWVnYSwgYWVzKHggPSBkYXRlLCB5ID0gbWVhbl92YWx1ZSwgY29sb3IgPSBsb2NhdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogICMgeWxhYigiTGF0ZW50IHRyZW5kXG4oJSBvZiBub3JtYWwpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xLCBhbHBoYSA9IC42LCBlbmQgPSAuNzUpICsKICAjIHRoZW1lX2RhcmsoYmFzZV9saW5lX3NpemUgPSAwLjUpICsKICBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fb21lZ2EsIGFscGhhID0gLjYsIHNpemUgPSAyLCBjb2xvciA9ICdyZWQnLCBuYW1lPSJNZWFuIG9mIGFsbCBzdGF0ZXMiKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gZnV0dXJlWzFdLCB4bWF4ID0gZnV0dXJlWzJdLCB5bWluID0gMCwgeW1heCA9IDEsIGFscGhhID0gLjIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKQoKcF9vbWVnYSA8LSBnX29tZWdhICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAjIG1hcmdpbiA9IGxpc3QobCA9IDE1MCksCiAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlbGF0aXZlIHRyYW5zbWlzc2lvbiAob21lZ2EpXG4oJSBvZiBub3JtYWwpXG4mbmJzcDsiKQogICAgICAgICAgICAgICAgICkKcF9vbWVnYQpgYGAKCiMgQ29ycmVsYXRpb24gYmV0d2VlbiBPbWVnYSBhbmQgUHJldmFsZW5jZQoKYSkgcHJlZGljdG9yID0gb21lZ2EodCk7IHJlc3BvbnNlID0gZGFpbHkgcHJldmFsZW5jZSh0KQoKYGBge3J9CgphbGxfcHJldmFsZW5jZSA8LSBzdGF0ZV9zdW1tYXJpZXMgJT4lCiAgZmlsdGVyKHBlcmlvZCA9PSAiUGFzdCIpICU+JQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHJldmFsZW5jZSIpICU+JQogIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIGRhdGUsIG1lYW5fdmFsdWUpICU+JQogIHJlbmFtZShwcmV2YWxlbmNlID0gbWVhbl92YWx1ZSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpCgptZWFuX2FsbF9wcmV2YWxlbmNlIDwtIGFsbF9wcmV2YWxlbmNlICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKHByZXZhbGVuY2UgPSBtZWFuKHByZXZhbGVuY2UpKQojIHBsb3QoeCA9IG1lYW5fb21lZ2EkbWVhbl92YWx1ZSwgeSA9IG1lYW5fYWxsX3ByZXZhbGVuY2UkcHJldmFsZW5jZSkKCm1lYW5zIDwtIG1lYW5fcGhpICU+JSAKICBmdWxsX2pvaW4obWVhbl9wc2kpICU+JSAKICBmdWxsX2pvaW4obWVhbl9vbWVnYSkgJT4lIAogIGZ1bGxfam9pbihtZWFuX2FsbF9wcmV2YWxlbmNlKQoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcihwZXJpb2QgPT0gIlBhc3QiKSAlPiUKICBmaWx0ZXIoc2ltX3R5cGUgPT0gJ3N0YXR1c19xdW8nKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhcmlhYmxlLCB2YWx1ZXNfZnJvbSA9IG1lYW5fdmFsdWUpICU+JSAKICBncm91cF9ieShsb2NhdGlvbikgJT4lIAogIG11dGF0ZShBVV9vbWVnYSA9IGN1bXN1bShvbWVnYSkpCgpDQSA8LSBzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgZmlsdGVyKGxvY2F0aW9uID09ICJDYWxpZm9ybmlhIikKCmxhZ2ZpbGwgPC0gZnVuY3Rpb24oeCwgbGFnLGZpbGw9MSkgewogIHJlcGxhY2VfbmEobGFnKHgsbGFnKSxmaWxsKQp9CgpDQSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwob21lZ2EsMCksIHkgPSB+cHJldmFsZW5jZSwgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ2FsaWZvcm5pYSIseGF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSx5YXhpcz1saXN0KHRpdGxlPSJwcmV2YWxlbmNlIikpCgpzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwob21lZ2EsMCksIHkgPSB+cHJldmFsZW5jZSwgY29sb3IgPSB+bG9jYXRpb24sCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUsICc8L2JyPiBTdGF0ZTogJywgbG9jYXRpb24gKSkgJT4lIAogICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQWxsIHN0YXRlcyIsIHhheGlzPWxpc3QodGl0bGU9Im9tZWdhIikseWF4aXM9bGlzdCh0aXRsZT0icHJldmFsZW5jZSIpKQoKbWVhbnMgJT4lIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfm9tZWdhLCB5ID0gfnByZXZhbGVuY2UsICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlICkpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJNZWFuIG9tZWdhLCBtZWFuIHByZXZhbGVuY2UgKGFjcm9zcyBzdGF0ZXMpIix4YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpLHlheGlzPWxpc3QodGl0bGU9InByZXZhbGVuY2UiKSkKCmBgYAoKLS0tCgpDYWxpZm9ybmlhLCBhbmQgbWVhbiBhY3Jvc3Mgc3RhdGVzLCBhdCB2YXJ5aW5nIGxhZ3MKCmBgYHtyfQpDQSAlPiUgZmlsdGVyKHBlcmlvZCA9PSAnUGFzdCcpICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bGFnZmlsbChvbWVnYSwwKSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAwIiwKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDcpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDciKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDE0KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAxNCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMjEpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDIxIikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwyOCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMjgiKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ2FsaWZvcm5pYSwgb21lZ2EgYXQgdmFyeWluZyBsYWdzIiwgeGF4aXMgPSBsaXN0KHRpdGxlID0gIm9tZWdhIikpCgptZWFucyAlPiUgZmlsdGVyKGRhdGUgPCBmdXR1cmVbMV0pICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bGFnZmlsbChvbWVnYSwwKSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAwIiwKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDcpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDciKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDE0KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAxNCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMjEpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDIxIikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwyOCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMjgiKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiTWVhbiBvbWVnYSwgbWVhbiBwcmV2YWxlbmNlIChhY3Jvc3Mgc3RhdGVzKVxub21lZ2EgYXQgdmFyeWluZyBsYWdzIiwgeGF4aXMgPSBsaXN0KHRpdGxlID0gIm9tZWdhIikpCgpgYGAKCi0tLQoKYikgcHJlZGljdG9yID0gQVVDIG9mIG9tZWdhIG92ZXIgdGltZTsgcmVzcG9uc2UgPSBjdW11bGF0aXZlIGFsbCBpbmZlY3Rpb25zIG92ZXIgdGltZQoKYGBge3J9CgpDQSAlPiUgZmlsdGVyKHBlcmlvZCA9PSAnUGFzdCcpICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bGFnZmlsbChBVV9vbWVnYSwwKSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gJ2xhZyAwJywgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gQXJlYSB1bmRlciBPbWVnYTogJywgQVVfb21lZ2EsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gQ3VtdWxhdGl2ZSBpbmZlY3Rpb25zOiAnLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDcpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDciKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDE0KSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyAxNCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMjEpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDIxIikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChBVV9vbWVnYSwyOCksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICJsYWcgMjgiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDU2KSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyA1NiIpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDYWxpZm9ybmlhLCBhcmVhIHVuZGVyIG9tZWdhIGF0IHZhcnlpbmcgbGFncyIseGF4aXM9bGlzdCh0aXRsZT0iQXJlYSB1bmRlciBvbWVnYSIpLHlheGlzPWxpc3QodGl0bGU9IkN1bXVsYXRpdmUgaW5mZWN0aW9ucyIpKQoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMCksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgY29sb3IgPSB+bG9jYXRpb24sCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gQXJlYSB1bmRlciBPbWVnYTogJywgQVVfb21lZ2EsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gQ3VtdWxhdGl2ZSBpbmZlY3Rpb25zOiAnLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IERhdGU6ICcsIGRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBTdGF0ZTogJywgbG9jYXRpb24pKSAlPiUgCiAgICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJBbGwgc3RhdGVzIiwgeGF4aXM9bGlzdCh0aXRsZT0iQXJlYSB1bmRlciBvbWVnYSAobGFnIDApIiksIHlheGlzPWxpc3QodGl0bGU9IkN1bXVsYXRpdmUgaW5mZWN0aW9ucyIpKQoKCmBgYAoKLS0tCgpjKSBwcmVkaWN0b3IgPSBBVUMgb2Ygb21lZ2E7IHJlc3BvbnNlID0gY3VtdWxhdGl2ZSBhbGwgaW5mZWN0aW9ucwoKYGBge3J9CnN0YXRlX3N1bW1hcmllc193aWRlICU+JSAKICBmaWx0ZXIocGVyaW9kID09ICdQYXN0JykgJT4lIAogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgCiAgc3VtbWFyaXNlKEFVX29tZWdhID0gbWF4KEFVX29tZWdhKSwgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucyA9IG1heChjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zKSkgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5BVV9vbWVnYSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IEFyZWEgdW5kZXIgT21lZ2E6ICcsIEFVX29tZWdhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IEN1bXVsYXRpdmUgaW5mZWN0aW9uczogJywgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBTdGF0ZTogJywgbG9jYXRpb24pKSAlPiUgCiAgICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBjdW11bGF0aXZlIGluZmVjdGlvbiB3aXRoIEFyZWEgdW5kZXIgb21lZ2EiLCB4YXhpcz1saXN0KHRpdGxlPSJBcmVhIHVuZGVyIG9tZWdhIiksIHlheGlzPWxpc3QodGl0bGU9IkN1bXVsYXRpdmUgaW5mZWN0aW9ucyIpKQpgYGAKCi0tLQoKZSkgbWFwIG9mIHNhbWUgKGNvcnJlbGF0aW9uLCBieSBzdGF0ZSkKClRvIGJlIG1hZGUKCiMgQ29ycmVsYXRpb24gYmV0d2VlbiBNb2JpbGl0eSBhbmQgT21lZ2EKCmBgYHtyfQoKQ0EgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5tb2JpbGl0eV90cmVuZCwgeSA9IH5vbWVnYSwgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gTW9iaWxpdHk6ICcsIG1vYmlsaXR5X3RyZW5kLCAnPC9icj4gb21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gRGF0ZTogJywgZGF0ZSkpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDYWxpZm9ybmlhIix4YXhpcz1saXN0KHRpdGxlPSJtb2JpbGl0eSB0cmVuZCIpLHlheGlzPWxpc3QodGl0bGU9Im9tZWdhIikpCgpzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfm1vYmlsaXR5X3RyZW5kLCB5ID0gfm9tZWdhLCBjb2xvciA9IH5sb2NhdGlvbiwKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBNb2JpbGl0eTogJywgbW9iaWxpdHlfdHJlbmQsICc8L2JyPiBvbWVnYTogJywgb21lZ2EsICc8L2JyPiBEYXRlOiAnLCBkYXRlLCAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uICkpICU+JQogICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQWxsIHN0YXRlcyIsIHhheGlzPWxpc3QodGl0bGU9Im1vYmlsaXR5IHRyZW5kIikseWF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSkKCm1lYW5zICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5waGksIHkgPSB+b21lZ2EsICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE1vYmlsaXR5OiAnLCBwaGksICc8L2JyPiBvbWVnYTogJywgb21lZ2EsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIk1lYW4gbW9iaWxpdHksIG1lYW4gcGhpIChhY3Jvc3Mgc3RhdGVzKSIseGF4aXM9bGlzdCh0aXRsZT0ibW9iaWxpdHkgdHJlbmQiKSx5YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpKQpgYGAKCg==